var express = require('express');
var router = express.Router();
const sql = require("../sql/sql");//引入增删改查命令
const order = require("../sql/order");//引入订单的数据集合
const tools = require("../tools")
const cart = require("../sql/cart");//引入购物车数据集合

// 商户的配置信息
const config = require("./../config")
// 支付需要使用的一些工具
const payTools = require("./../tools/tools")
// 数据请求
const axios = require("axios")
// 二维码生成工具
const qrcode = require("qrcode")

function createdorderId(){
  return Date.now() + '' + parseInt(Math.random()*10000)
}

router.get('/wxPay', function(req, res, next) {
  let {body, out_trade_no, total_fee} = req.query;

  // const body = "华为P80手机";   //商品描述
  // const out_trade_no = "lyaaaa_0003";   //商品订单
  // const total_fee = 1;  //付款金额，分

  const mch_id = config.mch_id;
  const appid = config.appid;
  const notify_url = config.notify_url;
  const nonce_str = payTools.randomString();
  const trade_type = "NATIVE";
  // 将来向统一下单api发送的数据，设定为集合M，准备生成签名信息
  const M = {
      appid, mch_id, nonce_str, notify_url, trade_type, body, out_trade_no, total_fee
  }
  // 生成签名
  const sign = payTools.getSign(M);
  // 将签名和要发送的数据转成xml格式
  const data = payTools.getXml(M,sign);
  // 利用axios发起 统一下单接口 的请求，将xml格式的数据，传入
  axios.post(config.unifiedorder, data).then(response=>{
      // console.log(response)
      // 将xml的数据，转成json
      let obj = payTools.xml2js(response.data)
      // 找到支付地址
      let code = obj.xml.code_url.value
      // 将支付地址转成二维码
      qrcode.toDataURL(code, (err, data) => {
          // 发给前端
          res.send({
              state: '200',
              title: '支付二维码',
              data
          })
      })
  })
})

/* GET home page. */
//添加 订单数据集合的接口 路由
router.post('/add', function(req, res, next) {
  const {userId, proData} = req.body;
  const token = req.headers.token;
  tools.verify(token).then(()=>{
    // 把数据插入到订单数据集合
    sql.insert(order,{
      orderId:createdorderId(),
      userId:userId,
      proData:proData,
      time:Date.now(),
      state:0
    }).then(()=>{
      // 插入成功后，删除购物车页面中选中的商品
      sql.find(cart,{userId}).then((data)=>{
        let arr = data[0].proData
        //用数组的方法filter筛选出未选中的商品
        arr = arr.filter((val)=>{
          return val.flag === false
        })
        //更新购物车数据集合中的商品信息
        sql.update(cart,{userId},{proData:arr}).then(()=>{
          res.send({
            state:200,
            title:"添加待付款订单成功"
          })
        })
      })
    })
  }).catch(()=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录"
    })
  })
});

/**
* @apiGroup 订单
* @api {post} /api/order/add 添加数据到订单集合
* @apiVersion 0.0.0
* @apiDescription 根据用户id和购物车数据，添加数据到订单集合
* @apiParam {string} userId 用户的id
* @apiParam {string} proData 用户订单商品详情
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"请求成功",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"请求失败",
*    "data":"NOT DATA"
* }
* @apiSampleRequest http://localhost:3001/api/order/add
*/

//添加 订单数据集合的接口 路由
router.get('/', function(req, res, next) {
  const {userId} = req.query;
  const token = req.headers.token;
  tools.verify(token).then(()=>{
	  sql.find(order,{userId},{_id:0,__v:0}).then((data)=>{
		  res.send({
			  state:200,
			  title:"获取成功",
			  data
		  })
	  })
  }).catch(()=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录"
    })
  })
});

/**
* @apiGroup 订单
* @api {get} /api/order 获取用户订单集合的数据
* @apiVersion 0.0.0
* @apiDescription 根据用户id，获取用户订单集合的数据
* @apiParam {string} userId 用户的id
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"获取成功",
*    "data":[{},{}]
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"请求失败",
*    "data":"NOT DATA"
* }
* @apiSampleRequest http://localhost:3001/api/order
*/


// 添加 修改订单状态接口 的路由
router.post('/pay', function(req, res, next) {
  const {userId,orderId} = req.body;
  const token = req.headers.token;
  tools.verify(token).then(()=>{
	  sql.update(order,{userId,orderId},{state:1}).then(()=>{
		  res.send({
			  state:200,
			  title:"修改成功",
		  })
	  })
  }).catch(()=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录"
    })
  })
});

/**
* @apiGroup 订单
* @api {post} /api/order/pay 修改支付状态
* @apiVersion 0.0.0
* @apiDescription 根据用户id和订单id，修改支付状态
* @apiParam {string} userId 用户的id
* @apiParam {string} orderId 订单id
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"修改成功",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"请求失败",
*    "data":"NOT DATA"
* }
* @apiSampleRequest http://localhost:3001/api/order/pay
*/

// 添加 修改订单状态接口 的路由
router.get('/detail', function(req, res, next) {
  const {userId,orderId} = req.query;
  const token = req.headers.token;
  tools.verify(token).then(()=>{
	  sql.find(order,{userId,orderId},{_id:0,__v:0}).then((data)=>{
		  res.send({
			  state:200,
			  title:"获取详情成功",
			  data:data[0]
		  })
	  })
  }).catch(()=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录"
    })
  })
});

/**
* @apiGroup 订单
* @api {get} /api/order/detail 获取订单详情
* @apiVersion 0.0.0
* @apiDescription 根据用户id和订单id，获取订单详情
* @apiParam {string} userId 用户的id
* @apiParam {string} orderId 订单id
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"修改成功",
*    "data":{}
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"请求失败",
*    "data":"NOT DATA"
* }
* @apiSampleRequest http://localhost:3001/api/order/detail
*/


module.exports = router;
